package com.atguigu.gmall.search;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

// Index = goods , Type = info  es 7.8.0 逐渐淡化type！  修改！
// 3分片。 2副本
// 3分片： 分担存储压力；500w商品，分成三堆，一堆由某个服务器负责存储。
// 2副本： 保证高可用，炸一个没关系；
@Data
@Document(indexName = "goods")
public class Goods {
    // 商品Id skuId
    @Id
    private Long id;

    //如果es中保存一个字符串，字符串对应的mapping默认是 text
    //凡是所有text字段都会分词存储和分词检索
    // Keyword：关键字，整体，不用分词，
    // index=false 不要给这个字段建立索引,因为不用用它来进行搜索
    @Field(type = FieldType.Keyword, index = false)
    private String defaultImg;

    //  es 中能分词的字段，这个字段数据类型必须是 text！keyword 不分词！
    // 分词检索和存储， 最大分词
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;

    @Field(type = FieldType.Double)
    private BigDecimal price;

    //  @Field(type = FieldType.Date)   6.8.1 日期格式化成指定的格式进行存储
    @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime; // 新品

    @Field(type = FieldType.Long)
    private Long tmId;

    @Field(type = FieldType.Keyword)
    private String tmName;

    @Field(type = FieldType.Keyword)
    private String tmLogoUrl;

    @Field(type = FieldType.Long)
    private Long category1Id;

    @Field(type = FieldType.Keyword)
    private String category1Name;

    @Field(type = FieldType.Long)
    private Long category2Id;

    @Field(type = FieldType.Keyword)
    private String category2Name;

    @Field(type = FieldType.Long)
    private Long category3Id;

    @Field(type = FieldType.Keyword)
    private String category3Name;

    //  商品的热度！ 我们将商品被用户点查看的次数越多，则说明热度就越高！
    @Field(type = FieldType.Long)
    private Long hotScore = 0L;

    // 平台属性 集合对象
    // Nested 支持嵌套查询
    // ES告诉我们，如果有一个数组对象，且要用这个对象的属性进行检索，必须把这个数组声明为Nested
    @Field(type = FieldType.Nested)
    private List<SearchAttr> attrs;

}
